package br.ucb.cesbdao.servicos;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.io.IOException;
import java.util.regex.PatternSyntaxException;

import javax.swing.AbstractListModel;
import javax.swing.JFrame;
import javax.swing.JTable;
import javax.swing.RowFilter;
import javax.swing.table.TableRowSorter;

import org.apache.log4j.Logger;

import br.ucb.cesbdao.beans.Acesso;
import br.ucb.cesbdao.beans.DadosSessaoUser;
import br.ucb.cesbdao.beans.Grupo;
import br.ucb.cesbdao.beans.Pessoa;
import br.ucb.cesbdao.beans.Trabalhador;
import br.ucb.cesbdao.controller.ControladorJanelas;
import br.ucb.cesbdao.enuns.EnumControleJanela;
import br.ucb.cesbdao.enuns.EnumErros;
import br.ucb.cesbdao.enuns.EnumMensagens;
import br.ucb.cesbdao.enuns.EnumTipoAtendimento;
import br.ucb.cesbdao.enuns.EnumTipoTrabalhador;
import br.ucb.cesbdao.janelas.Janela;
import br.ucb.cesbdao.janelas.JanelaAFI;
import br.ucb.cesbdao.janelas.JanelaMostraConsultaGrupo;
import br.ucb.cesbdao.model.AcessoModel;
import br.ucb.cesbdao.model.GrupoModel;
import br.ucb.cesbdao.model.PessoaModel;
import br.ucb.cesbdao.model.TrabalhadorModel;
import br.ucb.cesbdao.model.TrabalhadorPorGrupoModel;
import br.ucb.cesbdao.model.impl.AcessoModelImpl;
import br.ucb.cesbdao.model.impl.GrupoModelImpl;
import br.ucb.cesbdao.model.impl.PessoaModelImpl;
import br.ucb.cesbdao.model.impl.TrabalhadorModelImpl;
import br.ucb.cesbdao.model.impl.TrabalhadorPorGrupoModelImpl;
import br.ucb.cesbdao.modeloTabelas.ModeloTabelaAtendimentoApoio;
import br.ucb.cesbdao.utilBeans.AtendimentoUtil;
import br.ucb.cesbdao.visao.Visao;

public class JanelaUtil {
	private static Logger logger = Servicos.carregaLog(JanelaUtil.class);


	private static JanelaUtil janelaUtil;
	private static final char GERENTE = 'G';
	private static final char AFI	  = 'F';
	private static final char APOIO   = 'A';
	private static final char ATIVO	  = 'A';
	private static final char INATIVO = 'I';

	private JanelaUtil() {
		super();
	}

	public static JanelaUtil getInstance(){
		if(janelaUtil == null){
			janelaUtil = new JanelaUtil();
		}
		return janelaUtil;	
	}

	public void disposeWindow(Object classe){
		if(classe instanceof JFrame){
			JFrame janela = (JFrame) classe;
			janela.dispose();
		}
	}

	public ActionListener dialogFirstConnectionAdicionaActionListener(final String usuario, final String senha, final Class<?> classe){
		return new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent arg0) {
				try {
					Servicos.salvaSenhaBanco(usuario,senha);
					Servicos.verificaBancoAcesso();
					disposeWindow(classe.getClass());
				} catch (IOException e) {
					logger.error(e.getMessage());
					e.printStackTrace();
				}
			}
		};
	}

	public WindowListener janelaAdicionaWindowAdapter(final JFrame janela) {
		return new WindowAdapter() { 
			public void windowClosing(WindowEvent evJanela) {
				if (Visao.showYesNo(EnumMensagens.MSG_Q_CONFIRMACAO_SAIR_SYS.getMensagem(), "Aviso do Sistema")) {
					disposeWindow(janela);
					ControladorJanelas.invokeJFrame(janela.getClass().getSimpleName(), EnumControleJanela.JANELA_CONEXAO.getNomeJanela());
				}
			}
		};
	}

	public EnumErros JanelaConexaoConecta(String cpfFormatado,String senha,char tipoAcesso,JFrame janelaConexao){

		AcessoModel acessoModel = new AcessoModelImpl();
		PessoaModel pessoaModel = new PessoaModelImpl();
		TrabalhadorModel trabalhadorModel = new TrabalhadorModelImpl();
		String cpf = Servicos.stringNumberOfCPF(cpfFormatado);
		
		DadosSessaoUser.getInstance().setCPF(cpf);

		switch(Validadores.verificaConexao(cpf, senha))
		{
		case 'A':
			return EnumErros.ERRO_DADOS_VAZIO;
		case 'B':
			return EnumErros.ERRO_CPF_VAZIO;
		case 'C':
			return EnumErros.ERRO_SENHA_VAZIO;
		case 'D':
			Acesso acesso = acessoModel.procuraAcessoCEB(cpf);

			if(acesso == null){
				Visao.showMessageError(EnumMensagens.MSG_ERRO_DADOS_INCORRETOS.getMensagem(), "Aviso de Sistema");
			}
			else{
				Trabalhador atendente = trabalhadorModel.consultaTrabalhadorByCpf(cpf);
				Pessoa pessoa = pessoaModel.consultaPessoaById(atendente.getId());

				if( Servicos.verificaSenhaLogin(acesso.getSenha(),senha) && (pessoa!=null)){

					switch (tipoAcesso) {
					case AFI:
						if(atendente.getAcesso().equalsIgnoreCase(EnumTipoTrabalhador.AFI.getTipo()) || atendente.getAcesso().equalsIgnoreCase(EnumTipoTrabalhador.GERENTE.getTipo())){
							if(pessoa.getStatus() == ATIVO){
								Visao.showMessage(EnumMensagens.MSG_CONFIRMACAO_BEMVINDO.getMensagem()+getPrimeiroNomePessoa(pessoa.getNome()), "Aviso de Sistema");
								JanelaAFI.setTrabalhador(trabalhadorModel.consultaTrabalhadorByCpf(cpf));
								final JanelaAFI janelaAfi = new JanelaAFI();
								janelaAfi.setVisible(true);
								janelaAfi.addWindowListener(janelaAdicionaWindowAdapter(janelaAfi));
								janelaConexao.dispose();
							}else{
								Visao.showMessage(EnumMensagens.MSG_ALERTA_PERMISSAO_ACESSO.getMensagem(), "Aviso de Sistema");
							}
						}else{
							Visao.showMessage(EnumMensagens.MSG_ALERTA_PERMISSAO_ACESSO.getMensagem(), "Aviso de Sistema");
						}
						break;
					case APOIO:
						if(atendente.getAcesso().equalsIgnoreCase(EnumTipoTrabalhador.APOIO.getTipo()) || atendente.getAcesso().equalsIgnoreCase(EnumTipoTrabalhador.GERENTE.getTipo())){
							if(pessoa.getStatus() == ATIVO){
								Visao.showMessage(EnumMensagens.MSG_CONFIRMACAO_BEMVINDO.getMensagem()+getPrimeiroNomePessoa(pessoa.getNome()), "Aviso de Sistema");
								ControladorJanelas.invokeJFrame(this.getClass().getSimpleName(), EnumControleJanela.JANELA_APOIO.getNomeJanela());
								janelaConexao.dispose();
							}else
								Visao.showMessage(EnumMensagens.MSG_ALERTA_PERMISSAO_ACESSO.getMensagem(), "Aviso de Sistema");
						}else
							Visao.showMessage(EnumMensagens.MSG_ALERTA_PERMISSAO_ACESSO.getMensagem(), "Aviso de Sistema");
						break;
					case GERENTE:
						if(atendente.getAcesso().equalsIgnoreCase(EnumTipoTrabalhador.GERENTE.getTipo())){
							if(pessoa.getStatus() == ATIVO){
								Visao.showMessage(EnumMensagens.MSG_CONFIRMACAO_BEMVINDO.getMensagem()+getPrimeiroNomePessoa(pessoa.getNome()), "Aviso de Sistema");
								ControladorJanelas.invokeJFrame(this.getClass().getSimpleName(), EnumControleJanela.JANELA.getNomeJanela());
								janelaConexao.dispose();
							}else{
								Visao.showMessage(EnumMensagens.MSG_ALERTA_PERMISSAO_ACESSO.getMensagem(), "Aviso de Sistema");
							}
						}else{
							Visao.showMessage(EnumMensagens.MSG_ALERTA_PERMISSAO_ACESSO.getMensagem(), "Aviso de Sistema");
						}
						break;
					default:
						Visao.showMessageError(EnumMensagens.MSG_ERRO_PERFIL_OBRIGATORIO.getMensagem(), "Aviso de Sistema");
						break;
					}
					logger.info("Sistema sendo utilizado pelo usuário "+pessoa.getNome());
				}else{
					Visao.showMessageError(EnumMensagens.MSG_ERRO_DADOS_INCORRETOS.getMensagem(), "Aviso de Sistema");
					logger.info("Tentativa de login com dados incorretos. CPF = "+cpf);
					return EnumErros.ERRO_DADOS_INCORRETOS;
				}
			}
			break;	    		  
		case 'E':
			return EnumErros.ERRO_CPF_VAZIO;

		}
		return null;

	}

	@SuppressWarnings("rawtypes")
	public AbstractListModel criaModeloTipoAtendimento() {
		return new AbstractListModel() {
			private static final long serialVersionUID = 3016704269061052279L;
			public int getSize() {
				return EnumTipoAtendimento.values().length;
			}
			public Object getElementAt(int index) {
				return EnumTipoAtendimento.getByIndex(index);
			}
		};
	}

	public void janelaApoioRegistraAtendimento(final JTable tableAtenidmento, final ModeloTabelaAtendimentoApoio modeloTabelaAtendimento) {
		switch (tableAtenidmento.getSelectedColumn()) {
		case 1:
			AtendimentoUtil.registraAFI(tableAtenidmento, modeloTabelaAtendimento);
			break;
		case 2:
			AtendimentoUtil.registraMarcacao(tableAtenidmento, modeloTabelaAtendimento);
			break;
		case 3:
			AtendimentoUtil.registraEntrada(tableAtenidmento, modeloTabelaAtendimento);
			break;
		case 4:
			AtendimentoUtil.registraSaida(tableAtenidmento, modeloTabelaAtendimento);
		}
	}


	public void filtrarTabela(String busca,TableRowSorter<?> sorter,JTable tabela,int posicao){
		tabela.setRowSorter(sorter);
		if (busca.length() == 0)
			sorter.setRowFilter(null);
		else{
			try{
				sorter.setRowFilter(RowFilter.regexFilter("(?i)"+busca,posicao));
			}catch (PatternSyntaxException ex) {
				logger.error(ex.getMessage());
				Visao.showMessageWarning(EnumMensagens.MSG_ALERTA_FILTRAR.getMensagem(), "Aviso do Sistema");
			}
		}
	}
	
	public void filtrarTabela(String busca,TableRowSorter<?> sorter,JTable tabela,int posicao1,int posicao2,int posicoa3){
		tabela.setRowSorter(sorter);
		if (busca.length() == 0)
			sorter.setRowFilter(null);
		else{
			try{
				sorter.setRowFilter(RowFilter.regexFilter("(?i)"+busca,posicao1,posicao2,posicoa3));
			}catch (PatternSyntaxException ex) {
				logger.error(ex.getMessage());
				Visao.showMessageWarning(EnumMensagens.MSG_ALERTA_FILTRAR.getMensagem(), "Aviso do Sistema");
			}
		}
	}
	
	public void filtrarTabela(String busca,TableRowSorter<?> sorter,JTable tabela,int posicao1,int posicao2){
		tabela.setRowSorter(sorter);
		if (busca.length() == 0)
			sorter.setRowFilter(null);
		else{
			try{
				sorter.setRowFilter(RowFilter.regexFilter("(?i)"+busca,posicao1,posicao2));
			}catch (PatternSyntaxException ex) {
				logger.error(ex.getMessage());
				Visao.showMessageWarning(EnumMensagens.MSG_ALERTA_FILTRAR.getMensagem(), "Aviso do Sistema");
			}
		}
	}
	public void janelaListarAtendente_AlterarTrabalhador(JTable tabelaTrabalhador, Trabalhador trabalhador){
		PessoaModel pessoaModel = new PessoaModelImpl();
    	AcessoModel acessoModel = new AcessoModelImpl();
        if(tabelaTrabalhador.getSelectedRow() == -1){
            Visao.showMessageWarning(EnumMensagens.MSG_ALERTA_AA_N_SELECIONADO.getMensagem(), "Aviso do sistema");
            return;
        }
        if(trabalhador.getStatus() == INATIVO){
            if(Visao.showYesNo(EnumMensagens.MSG_Q_CONFIRMACAO_ATIVAR_AA.getMensagem(), "Aviso do sistema")){
                if(pessoaModel.alteraStatusPessoa('A',trabalhador.getId()) != 0)
                	Visao.showMessage(EnumMensagens.MSG_CONFIRMACAO_ATIVAR_AA.getMensagem(), "Aviso do sistema");
                else{
                	Visao.showMessageWarning(EnumMensagens.MSG_ALERTA_ATIVAR_AA.getMensagem(), "Aviso do sistema");
                	return;
                }
            }
            else{
                Visao.showMessageWarning(EnumMensagens.MSG_ERRO_ATIVAR_AA.getMensagem(), "Aviso do sistema");
                return;
            }
        }
        Janela.setTxt_codTrabalhador(trabalhador.getId().toString());
        Janela.setTxt_nomeTrabalhador(""+trabalhador.getNome());
        Janela.setTxt_dnTrabalhador(DateUtil.formatDateOut(trabalhador.getDataNascimento()));
        Janela.setRb_sexoTrabalhador(""+trabalhador.getSexo());
        Janela.setTxt_enderecoTrabalhador(trabalhador.getEndereco());
        Janela.setTxt_cpfTrabalhador(trabalhador.getCpf());
        String telefone = (trabalhador.getTelefone());
        Janela.setTxt_telefoneTrabalhador(trabalhador.getTelefone());
        if(telefone != null && telefone.length() > 20){
           String telefones[] = telefone.split("  ");
           Janela.setTxt_telefoneTrabalhador(telefones[0]);
           if(telefones[1] != "")
              Janela.setTxt_telefoneTrabalhador2(telefones[1]);
           if(telefones[2] != "")
           	  Janela.setTxt_telefoneTrabalhador3(telefones[2]);
           if(telefones[3] != "")
           	  Janela.setTxt_telefoneTrabalhador4(telefones[3]);
           if(telefones[4] != "")
           	  Janela.setTxt_telefoneTrabalhador5(telefones[4]);
           if(telefones[5] != "")
        	  Janela.setTxt_telefoneTrabalhador6(telefones[5]);
        }
        
        	
        Janela.setTxt_emailTrabalhador(trabalhador.getEmail());
        Janela.setTxt_codigoSocioTrabalhador(trabalhador.getIdSocio().toString());
        Janela.setTxt_senha((acessoModel.consultaAcessoCpf(trabalhador.getCpf())).getSenha());
        Janela.setAmbienteAlteracaoTrabalhador();
	}
	
	public void janelaListarAtendenteByGrupo_Alterar(JTable tabela){
		GrupoModel model = new GrupoModelImpl();
    	if(tabela.getSelectedRow() == -1){
            Visao.showMessageWarning(EnumMensagens.MSG_ALERTA_AA_N_SELECIONADO.getMensagem(), "Aviso do sistema");
            return;
        }
        Janela.setIdGrupoVinculaGrupo(Janela.getIdGrupoVinculaGrupo());
        Janela.setTxt_idGrupoVinculaGrupo((model.consultaGrupoID(Janela.getIdGrupoVinculaGrupo())).getNome());
        Janela.setIdTrabalhadorVinculaGrupo((Integer)tabela.getValueAt(tabela.getSelectedRow(), 0));
        Janela.setTxt_idTrabalhadorVinculaGrupo(""+tabela.getValueAt(tabela.getSelectedRow(), 1));
        Janela.setAmbienteAlteracaoTrabalhadorVinculaGrupo();
	}
	public void janelaListarAtendenteByGrupo_Excluir(JTable tabela){
		TrabalhadorPorGrupoModel model = new TrabalhadorPorGrupoModelImpl();
    	if(tabela.getSelectedRow() == -1){
            Visao.showMessageWarning(EnumMensagens.MSG_ALERTA_AA_N_SELECIONADO.getMensagem(), "Aviso do sistema");
            return;
        }
        if((model.excluiTrabalhadorGrupo(Integer.parseInt(""+tabela.getValueAt(tabela.getSelectedRow(), 0)), Janela.getIdGrupoVinculaGrupo())) != 0)
        	Visao.showMessage(EnumMensagens.MSG_CONFIRMACAO_EXLCUIR_VINCULO.getMensagem(), "Aviso do Sistema");
        else
        	Visao.showMessageWarning(EnumMensagens.MSG_ALERTA_EXLCUIR_VINCULO.getMensagem(), "Aviso do Sistema");
	}
	public void janelaListaGrupo_Alterar(JTable tabelaGrupo,Grupo grupo){
		if(tabelaGrupo.getSelectedRow() == -1){
            Visao.showMessageWarning(EnumMensagens.MSG_ALERTA_GRUPO_N_SELECIONADO.getMensagem(), "Aviso do sistema");
            return;
        }
        GrupoModel model = new GrupoModelImpl();
        if(grupo.getStatus() == 'I'){
	        if(Visao.showYesNo(EnumMensagens.MSG_Q_CONFIRMACAO_INATIVAR_GRUPO.getMensagem(), "Aviso do sistema")){
	            if(model.alteraGrupo('A',grupo.getIdGrupo()) != 0)
	            	Visao.showMessageWarning(EnumMensagens.MSG_CONFIRMACAO_ATIVAR_GRUPO.getMensagem(), "Aviso do sistema");
	            else{
	            	Visao.showMessageWarning(EnumMensagens.MSG_ALERTA_ATIVAR_GRUPO.getMensagem(), "Aviso do sistema");
	            	return;
	            }
	        }
	        else{
	            Visao.showMessageWarning(EnumMensagens.MSG_ERRO_ATIVAR_GRUPO.getMensagem(), "Aviso do sistema");
	            return;
	        }
        }
        Janela.setTxt_codGrupo(""+grupo.getIdGrupo());
        Janela.setTxt_numeroGrupo(""+grupo.getNumeroGrupo());
        Janela.setTxt_nomeGrupo(""+grupo.getNome());
        Janela.setCb_diaSemanaGrupo(""+grupo.getDiaSemana());
        Janela.setTxt_horarioInicialGrupo(""+grupo.getHorarioInicial());
        Janela.setTxt_horarioFinalGrupo(""+grupo.getHorarioFinal());
        Janela.setAmbienteAlteracaoGrupo();
	}
	public void janelaListaGrupo_Visualizar(JTable tabelaGrupo, Grupo grupo){
		if(tabelaGrupo.getSelectedRow() == -1){
            Visao.showMessageWarning(EnumMensagens.MSG_ALERTA_GRUPO_N_SELECIONADO.getMensagem(), "Aviso do sistema");
            return;
        }
        ControladorJanelas.invokeJFrame(this.getClass().getSimpleName(), EnumControleJanela.JANELA_MOSTRA_CONSULTA_GRUPO.getNomeJanela());
        JanelaMostraConsultaGrupo.setTxt_idMostraGrupo(""+grupo.getIdGrupo());
        JanelaMostraConsultaGrupo.setTxt_nomeMostraGrupo(""+grupo.getNome());
        JanelaMostraConsultaGrupo.setTxt_diaSemanaMostraGrupo(""+grupo.getDiaSemana());
        JanelaMostraConsultaGrupo.setTxt_horarioInicialMostraGrupo(""+grupo.getHorarioInicial());
        JanelaMostraConsultaGrupo.setTxt_horarioFinalMostraGrupo(""+grupo.getHorarioFinal());
        JanelaMostraConsultaGrupo.setTxt_statusMostraGrupo(""+grupo.getStatus());
	}
	
	private String getPrimeiroNomePessoa(String nomeCompleto){
		String [] nomes = nomeCompleto.split(" ");
		return nomes[0];
	}
	
}

